/**
 * @file srt.h
 * @brief 
 * @note 
 * @author Leo
 * @date 2022-4-24
 * @version 1.0

 * @par          修改日志
 * <table>
 * <tr><th>Date<th>Version<th>Author<th>Description
 * <tr><td>2022-4-24<td>1.0<td>Leo<td>创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _SRT_H_
#define _SRT_H_

#include "ofc_types.h"
//#include "mfc/mfc_version.h"
#include "hcc_error_code_mid_srt.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum TSrtPrivilegeTag
{
    kSrtPrivilegeLow      = 0,       ///< 低优先级
    kSrtPrivilegeMid      = 1,      ///< 中优先级
    kSrtPrivilegeHigh     = 2,      ///< 高优先级
    kSrtPrivilegeCritical = 3,      ///< 最高优先级
} TSrtPrivilege;

/**
 * 参数权限等级枚举
 */
enum TSrtPermissionLevelEnumTag
{
    kSrtPermissionLevelRoot = 0,    ///< 超级权限
    kSrtPermissionLevelFactory = 1, ///< 工厂权限
    kSrtPermissionLevelInstall = 2, ///< 安装权限
    kSrtPermissionLevelUser = 3,    ///< 用户权限
};
typedef enum TSrtPermissionLevelEnumTag TSrtPermissionLevelEnum;

typedef enum TSrtPropTypeTag
{
    kSrtPropTypeBool   = 0,         ///< Bool类型
    kSrtPropTypeUInt8  = 1,         ///< UInt8类型
    kSrtPropTypeUInt16 = 2,         ///< UInt16类型
    kSrtPropTypeUInt32 = 3,         ///< UInt32类型
    kSrtPropTypeUInt64 = 4,         ///< UInt64类型
    kSrtPropTypeBin    = 5,         ///< Bin类型
} TSrtPropType;

typedef struct TSrtSyncPropTag
{
    UInt16 id;                  ///< id或者命令
    UInt8 size;                 ///< value的大小
    UInt8 value[1];             ///< 数据
} TSrtSyncProp;

/**
 * 枚举属性的回调函数
 * @param prop: 属性信息
 * @param type: 属性类型
 * @param user_data: 用户自定义数据,调用枚举属性函数时,由用户传入
 * @return
 */
typedef void (*TSrtEnumPropertyCallBack)(const TSrtSyncProp *prop, TSrtPropType type, void *user_data);

/**
 * 初始化   
 * @return none
 */
void SrtInit(void);

/**
 * 反初始化   
 * @return none
 */
void SrtDone(void);

/**
 * 获取接口的版本号   
 * @return 版本信息;如: 0x0708090A 表示 7.8.9.10
 */
void SrtGetSoftwareVer(UInt32 *soft_ver);

/**
 * 变更通知数据
 */
typedef struct TSrtNotifyDataTag TSrtNotifyData;
struct TSrtNotifyDataTag
{
    UInt32          timestamp;              ///< 时间戳
    UInt32          param_id;               ///< 参数ID
    const UInt8     *new_param_value;       ///< 新数据值
    UInt16          new_param_len;          ///< 新长度
    //TSrtTypeEnum    srt_type;               ///< 类型
};

/**
 * SRT变更通知回调函数
 */
typedef void (*TSrtDoChangeNotify)(void *sender, const TSrtNotifyData *notify_data);

/**
 * 注册参数修改通知
 * @param param_notify_object: 通知对象指针
 * @param param_notify: IsrtNotify事件通知接口
 * @return >=0: 成功, < 0,失败,错误码参考TsrtErrorEnum
 * @note 注册参数最多注册5次
 */
Int32 SrtRegisterParamEvent(const void *param_notify_object, const TSrtDoChangeNotify param_notify);

/**
 * 获取参数类型
 * @param param_id: 参数ID
 * @param param_type: 见类型定义TSrtTypeEnum
 * @param param_len: 参数长度
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueType(UInt32 param_id, Int32 *param_type, Int16 *param_len);

/**
 * 判断当前ID是否属于属性ID
 * @param param_id: 参数ID
 * @return 0:表示ID属于属性 -1:表示ID不属于属性
 */
Int32 SrtIsOwnerId(UInt32 param_id);

/**
 * 恢复指定组别参数为默认值
 * @param authority: 用户权限等级，参考 @ref TSrtPermissionLevelEnum
 * @return 0:成功，< 0, 失败，错误码参考THccMidSrtErrorCode
 */
Int32 SrtRestoreParam(Int32 authority);

/**
 * 恢复所有组别参数为默认值
 * @param none
 * @return 0:成功，< 0, 失败，错误码参考THccMidSrtErrorCode
 */
Int32 SrtRestoreParamAll(void);

/**
 * 早期版本字符串类型的键值转换未Id类型
 * @note
 * 1. 仅用于早期版本使用字符串作为关键字的版本
 * 2. 本次发布之后的应用程序需要使用属性,必须使用Id类型
 * @param key: 字符串类型的关键字
 * @param id: 转换后的Id值.本参数不运行为空
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtKeyToId(const char *key, Int32 *id);

/**
 * @brief 刷出属性到永久存储器
 * 
 * @return Int32 返回
 */
Int32 SrtFlush(void);

//--------------------------------------------------------------------------------
// 独立属性存取接口

/**
 * 读取无符号单字节类型参数
 * @param param_id: 参数ID
 * @param param_value: 参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueU08(UInt32 param_id, UInt8 *param_value);

/**
 * 设置无符号单字节类型参数
 * @param param_id: 参数ID
 * @param param_value: 设置的参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtSetValueU08(UInt32 param_id, UInt8 param_value);

/**
 * 读取无符号Short类型参数
 * @param param_id: 参数ID
 * @param param_value: 参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueU16(UInt32 param_id, UInt16 *param_value);

/**
 * 设置无符号Short类型参数
 * @param param_id: 参数ID
 * @param param_value: 设置的参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtSetValueU16(UInt32 param_id, UInt16 param_value);

/**
 * 读取无符号int类型参数
 * @param param_id: 参数ID
 * @param param_value: 参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueU32(UInt32 param_id, UInt32 *param_value);

/**
 * 设置无符号int类型参数
 * @param param_id: 参数ID
 * @param param_value: 设置的参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtSetValueU32(UInt32 param_id, UInt32 param_value);

/**
 * 读取无符号int64类型参数
 * @param param_id: 参数ID
 * @param param_value: 参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueU64(UInt32 param_id, UInt64 *param_value);

/**
 * 设置无符号int64类型参数
 * @param param_id: 参数ID
 * @param param_value: 设置的参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtSetValueU64(UInt32 param_id, UInt64 param_value);

/**
 * 读取数据块(Binary和string)
 * @param param_id: 参数ID
 * @param buf: 存储参数的缓冲区 ,为NULL时返回实际参数长度
 * @param buf_len: 存储参数缓冲区的长度
 * @return 成功返回读取到的参数值长度，错误返回错误码，参考THccMidSrtErrorCode
 */
Int32 SrtGetValueMem(UInt32 param_id, UInt8 *buf, UInt16 buf_len);

/**
 * 写入数据块(Binary和string)
 * @param param_id: 参数ID
 * @param buf: 存储参数的缓冲区
 * @param buf_len: 存储参数缓冲区的长度
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtSetValueMem(UInt32 param_id, const UInt8 *buf, UInt16 buf_len);

/**
 * 读取bool类型参数
 * @param param_id: 参数ID
 * @param bool_val: 参数值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueBool(UInt32 param_id, Bool *bool_val);

/**
 * 设置bool类型参数
 * @param param_id: 参数ID
 * @param bool_val: bool值
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtSetValueBool(UInt32 param_id, Bool bool_val);

//--------------------------------------------------------------------------------
// 跨进程的私有属性存取接口

/**
 * 根据私有进程的名称获取其proc_id,用于跨进程访问其私有属性
 * @note: 对于本进程的私有属性的访问只需调用通用属性的接口,无需使用本组接口
 * @param proc_name: 进程名称
 * @param proc_id: 进程id
 * @return kHccMidSrtErrorSuccess或者kHccMidSrtErrorProcNotExists; 如有其它错误参见THccMidSrtErrorCode
 */
Int32 SrtGetProcId(const char *proc_name, Int32 *proc_id);

/**
 * 枚举所有有效的属性值
 * @param CallBack: 回调函数
 * @param user_data: 用户自定义数据,该数据作为CallBack的参数(user_data参数)
 * @return 
 */
void SrtEnumProperties(TSrtEnumPropertyCallBack CallBack, void *user_data);

//----------------新增-------------------//
/**
 * 获取参数恢复出厂级别
 * @param param_id: 参数ID
 * @param param_restore: 见类型定义TSrtPermissionLevelEnum
 * @param param_len: 参数长度
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetValueRestoreLevel(UInt32 param_id, Int32 *param_restore, Int16 *param_len);

/**
 * 获取属性时间戳
 * @param param_id: 参数ID
 * @param timestamp: 时间戳地址
 * @return 错误码参考THccMidSrtErrorCode
 */
Int32 SrtGetTimeStamp(UInt32 param_id, UInt32 *timestamp);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif // _SRT_H_
